//
//@File    :	8.13_twoswap.cpp
//@Time    :	2021/08/17 21:25:44
//@Auther  :	Sun Sheng
//@Contact :	970340843@qq.com
//@Desc    :	specialization overrides a template
//

//显式具体化(explicit specialization)
//只修改结构struct中的部分成员,而不是整个结构struct时,参数保持不变(对结构的引用)
//对于给定的函数名,可以有非模板函数,模板函数,显式具体化函数一级他们的重载版本
//优先顺序:非模板函数>具体化>常规模板

//以下job皆可替换成任意结构名称
//非模板函数:void Swap(job &,job &);
//模板函数:template <typename T> void Swap(T &,T &);
//具体化:template <> void Swap<job>(job &,job &);
//或者去掉<job>:template <> void Swap(job &,job &);

#include <iostream>

using namespace std;

template <typename T>
void Swap(T &a, T &b);

struct job
{
    char name[40];
    double salary;
    int floor;
};
template <>
void Swap<job>(job &j1, job &j2);
void Show(job &j);

int main()
{
    cout.precision(2);
    cout.setf(ios::fixed, ios::floatfield);
    int i = 10, j = 20;
    cout << "i,j = " << i << ", " << j << ".\n";
    cout << "Using compiler-generated int swapper:\n";
    Swap(i, j);
    cout << "Now i,j = " << i << ", " << j << ".\n";

    job sue = {"Susan Yaffee", 73000.60, 7};
    job sidney = {"Sidney Taffee", 78060.72, 9};
    cout << "Before job swapping:\n";
    Show(sue);
    Show(sidney);
    Swap(sue, sidney);
    cout << "After job swapping:\n";
    Show(sue);
    Show(sidney);
    system("pause");
    return 0;
}
template <typename T>
void Swap(T &a, T &b)
{
    T temp;
    temp = a;
    a = b;
    b = temp;
}

template <>
void Swap<job>(job &j1, job &j2)
{
    double t1;
    int t2;
    t1 = j1.salary;
    j1.salary = j2.salary;
    j2.salary = t1;

    t2 = j1.floor;
    j1.floor = j2.floor;
    j2.floor = t2;
}
void Show(job &j)
{
    cout << j.name << ": $" << j.salary
         << " on floor " << j.floor << endl;
}